package infra

import "github.com/tietang/props/kvs"

const (
	KeyProps = "props"
)

// 基础资源上下文结构体
type StarterContext map[string]interface{}

// 提供上下文获取函数
func (s StarterContext) Props() kvs.ConfigSource {
	p := s[KeyProps]
	if p == nil {
		panic("config not init!")
	}
	return p.(kvs.ConfigSource)
}

// 基础资源启动器接口
type Starter interface {
	// 1. 系统启动，初始化一些基础资源
	Init(StarterContext)
	// 2. 系统基础资源的安装
	Setup(StarterContext)
	// 3. 启动系统资源
	Start(StarterContext)
	// 4. 启动器是否可阻塞
	StartBlocking() bool
	// 5. 资源停止和销毁
	Stop(StarterContext)
}

// 基础空启动器实现，为了方便资源启动器的代码实现
type BaseStarter struct {
}

func (b *BaseStarter) Init(ctx StarterContext)  {}
func (b *BaseStarter) Setup(ctx StarterContext) {}
func (b *BaseStarter) Start(ctx StarterContext) {}
func (b *BaseStarter) StartBlocking() bool      { return false }
func (b *BaseStarter) Stop(ctx StarterContext)  {}

// 启动器注册器
type starterRegister struct {
	starter []Starter
}

// 启动器注册方法
func (r *starterRegister) Register(s Starter) {
	r.starter = append(r.starter, s)
}

// 当前所有已经注册了的starter
func (r *starterRegister) AllStarters() []Starter {
	return r.starter
}

var StarterRegister *starterRegister = new(starterRegister)

// 向外暴露
func Register(s Starter) {
	StarterRegister.Register(s)
}

// 系统基础资源的启动管理
func SystemRun() {

}
